package com.sun.jdk.inter;

public class Demo01Interface {

    public static void main(String[] args) {
        A b = new B();
        b.test1();
        b.test2();
        b.defaultMethod();

        A c = new C();
        c.test1();
        c.test2();
        c.defaultMethod();

        // 接口中的静态方法，只能通过接口名调用
        A.staticMethod();

    }
}


class B implements A{

    @Override
    public void test1() {
        System.out.println("实现类B重写了接口A中的test1()方法...");
    }

    @Override
    public void test2() {
        System.out.println("实现类B重写了接口A中的test2()方法...虽然这个test2()方法在B类中用不到，但还是要重写");
    }
}

class C implements A{

    @Override
    public void test1() {
        System.out.println("实现类C重写了接口A中的test1()方法...");
    }

    @Override
    public void test2() {
//        System.out.println("实现类C重写了接口A中的test2()方法...虽然这个test2()方法在C类中用不到，但还是要重写");
    }
}

interface A{

    public abstract void test1();

    // 由于业务需求，接口A某一天需要新增一个方法，就会导致之前所有已经实现了A接口的类都要重新修改（即，重写这个新增加的方法）
    public abstract void test2();

    // JDK8之后，在接口里面可以新增默认方法，并且新增了默认方法之后，其他已经实现该接口的类都不用修改，还是能正常工作。
    // 并且实现类的对象实例调用接口中新增的默认方法
    public default void defaultMethod(){
        System.out.println("JDK8之后，在接口中可以新增默认方法....");
    }

    // JDK8之后，在接口中可以添加静态方法，并且新增了静态方法之后，其他已经实现该接口的类都不用修改，还是能正常工作。
    // 接口中的静态方法，只能通过接口名调用
    public static void staticMethod(){
        System.out.println("JDK8之后，在接口中可以新增静态方法....");
    }
}
